IrisをRed ChainerでTrainerを使って書いてみる
2019-11-10
最終的にデータセットの分割も実装した
code:sh
$ bundle exec ruby examples/iris/iris.rb
epoch iteration main/loss main/accuracy val/main/loss val/main/accuracy elapsed_time
1 19 1.91383 0.473684 1.42424 0.25 0.0353489
2 38 0.996296 0.578947 0.362854 0.96875 0.0773659
3 57 0.456371 0.802632 0.396609 0.75 0.114415
4 76 0.500983 0.736842 0.636984 0.75 0.151413
5 95 0.445901 0.710526 0.363899 0.75 0.18836
6 114 0.382488 0.842105 0.388711 0.75 0.225496
7 133 0.347851 0.842105 0.263879 0.875 0.264128
8 152 0.297205 0.894737 0.422845 0.75 0.30656
9 171 0.342139 0.868421 0.148019 1 0.343567
10 190 0.301463 0.855263 0.144839 1 0.382298
11 209 0.241771 0.921053 0.292805 0.875 0.418857
12 228 0.321759 0.828947 0.134429 1 0.455971
13 247 0.260443 0.907895 0.535753 0.75 0.493426
14 266 0.271462 0.907895 0.16344 0.9375 0.530865
15 285 0.24269 0.907895 0.0941306 1 0.574575
16 304 0.20683 0.921053 0.143846 0.9375 0.61255
17 323 0.447726 0.828947 0.869368 0.71875 0.650458
18 342 0.257087 0.921053 0.119261 0.9375 0.68614
19 361 0.304906 0.855263 0.217603 0.875 0.724068
20 380 0.188646 0.934211 0.277539 0.78125 0.760504
21 399 0.297835 0.868421 0.930768 0.75 0.796309
22 418 0.335905 0.907895 0.264524 0.875 0.83887
23 437 0.236816 0.881579 0.0932043 1 0.878111
24 456 0.199524 0.934211 0.295359 0.78125 0.914525
25 475 0.214761 0.907895 0.0871421 0.96875 0.951263
26 494 0.191688 0.934211 0.873688 0.75 0.988837
27 513 0.258549 0.907895 0.146495 0.9375 1.02562
28 532 0.206727 0.907895 0.0809979 1 1.06267
29 551 0.229389 0.921053 0.11002 0.9375 1.1
30 570 0.211139 0.921053 0.61987 0.75 1.14074
----------------------------------------------------------------------------------------------------
test000: prediction = 0, answer = 0
test001: prediction = 1, answer = 1
test002: prediction = 0, answer = 0
test003: prediction = 0, answer = 0
test004: prediction = 0, answer = 0
test005: prediction = 1, answer = 1
test006: prediction = 0, answer = 0
test007: prediction = 0, answer = 0
test008: prediction = 1, answer = 1
test009: prediction = 0, answer = 0
test010: prediction = 1, answer = 1
test011: prediction = 1, answer = 1
test012: prediction = 0, answer = 0
test013: prediction = 0, answer = 0
test014: prediction = 1, answer = 1
test015: prediction = 0, answer = 0
test016: prediction = 1, answer = 1
test017: prediction = 1, answer = 1
test018: prediction = 1, answer = 2
test019: prediction = 1, answer = 1
test020: prediction = 1, answer = 2
test021: prediction = 1, answer = 2
test022: prediction = 1, answer = 1
test023: prediction = 1, answer = 2
test024: prediction = 1, answer = 2
test025: prediction = 1, answer = 1
test026: prediction = 1, answer = 2
test027: prediction = 0, answer = 0
test028: prediction = 1, answer = 2
test029: prediction = 1, answer = 1
test030: prediction = 1, answer = 2
test031: prediction = 1, answer = 1
test032: prediction = 0, answer = 0
test033: prediction = 1, answer = 2
test034: prediction = 0, answer = 0
test035: prediction = 0, answer = 0
test036: prediction = 1, answer = 2
test037: prediction = 1, answer = 2
test038: prediction = 0, answer = 0
test039: prediction = 0, answer = 0
test040: prediction = 0, answer = 0
test041: prediction = 1, answer = 1
test042: prediction = 1, answer = 2
test043: prediction = 1, answer = 1
test044: prediction = 2, answer = 2
accuracy: 73.33333333333333
/icons/hr.icon
2019-11-06
numpy.random.RandomState の書き換えで詰まったので ruby-jp.slack で聞いてみた
Numo::NArray のmasa16さんからコメントをいただけた
numpy.random.RandomState 相当のものは、Numo::NArray にはまだありません。
乱数生成メソッドとして Numo::NArray#rand があります。
とのこと。
そもそも何やろうとしてるのかというと
code:py
def split_dataset_random(dataset, first_size, seed=None):
order = np.random.RandomState(seed).permutation(len(dataset))
return split_dataset(dataset, first_size, order)
order はdatasetと同じ長さのランダムな配列(?)的なものっぽい。
colabで確認した
code:py
order = np.random.RandomState(None).permutation(10)
もういったんこれでよくない?という気持ちになってきた。ランダム化関数がよくないんだろうけど
code:rb
1 pry(main)> (0...10).to_a.shuffle 一旦データ分割はしないでやることにした〜。ちょっとそれ過ぎたので。
出来たぞ〜
code:sh
$ ruby examples/iris/iris.rb
epoch iteration main/loss main/accuracy val/main/loss val/main/accuracy elapsed_time
1 38 1.27775 0.572368 0.486145 0.671053 0.0862801
2 76 0.426431 0.835526 0.333205 0.828947 0.168189
3 114 0.333968 0.875 0.910565 0.671053 0.250365
4 152 0.310298 0.888158 0.211823 0.940789 0.338512
5 190 0.23852 0.927632 0.185181 0.940789 0.415007
6 228 0.260866 0.907895 0.177153 0.953947 0.497279
7 266 0.19399 0.921053 0.226963 0.894737 0.580174
8 304 0.199758 0.901316 0.325668 0.842105 0.66282
9 342 0.185922 0.914474 0.134692 0.960526 0.739775
10 380 0.178372 0.934211 0.129198 0.947368 0.8236
11 418 0.259062 0.894737 0.887537 0.684211 0.903739
12 456 0.209445 0.927632 1.46042 0.657895 0.981753
13 494 0.237419 0.914474 0.131947 0.953947 1.06388
14 532 0.234115 0.907895 0.603199 0.736842 1.14254
15 570 0.153484 0.940789 0.143095 0.940789 1.21947
16 608 0.14754 0.921053 0.0977607 0.973684 1.30694
17 646 0.137228 0.960526 0.0954946 0.973684 1.38411
18 684 0.187637 0.927632 0.189693 0.921053 1.4672
19 722 0.162005 0.940789 0.550461 0.782895 1.5586
20 760 0.185926 0.894737 0.0925725 0.973684 1.63787
21 798 0.15027 0.927632 0.171659 0.914474 1.71667
22 836 0.146723 0.934211 0.156561 0.921053 1.80469
23 874 0.147191 0.953947 0.108891 0.940789 1.88302
24 912 0.282145 0.901316 1.5994 0.657895 1.96129
25 950 0.204538 0.934211 0.125127 0.934211 2.04901
26 988 0.208726 0.907895 0.140285 0.927632 2.12689
27 1026 0.168366 0.934211 0.356917 0.855263 2.20725
28 1064 0.136338 0.940789 0.380733 0.828947 2.29099
29 1102 0.167995 0.940789 0.127527 0.934211 2.36911
30 1140 0.11718 0.967105 0.24485 0.894737 2.44854
/icons/hr.icon
2019-11-05
昨日の続き
データセットを分割する処理を実装しよう
code:こういうやつ.py
from chainer.datasets import split_dataset_random
train_val, test = split_dataset_random(dataset, int(len(dataset) * 0.7), seed=0)
train, valid = split_dataset_random(train_val, int(len(train_val) * 0.7), seed=0)
chainerのリポジトリを見るぞ〜真似して実装する
DatasetMixinクラスを継承しているからこっちも実装しないと...
numpy.random.RandomState の書き換えで詰まったので ruby-jp.slack で聞いてみた
/icons/hr.icon
2019-11-04
少し間が空いた、久々にやってくぞ〜
Red Chainerの書き方になれることが目的
適当なディレクトリを作ろう。 try-red-chainer とかでいいか。
あ、まずはChainerがちゃんと動くよね?の確認をしながらね。
なので、まずはこいつをコピペして動くかどうかを確認したいね。
ruby examples/red-chainer-originals/iris/iris.rb で動作確認。OK、動いた。
MLPクラスを定義した〜
アップデータ、トレーナー、OK
よし、イテレータの準備以外は終わった。
Irisのデータはred-chainer gem中にはなくて、red-datasets gemの中にあるのか〜
さて、どういう形だったらiteratorを作れるんだったっけ?
TupleDatasetの形になっていればいいんだね
入力値を並べた配列と目標値を並べた配列を与えると、1 つ 1 つを取り出して対応するペアを作って返してくれる
ふむふむ。pythonでいうと (array([5.1, 3.5, 1.4, 0.2], dtype=float32), 0) こんな感じね。
Chainer::Datasets::MNIST でやっている処理を真似て、Iris用のデータセットを取得するモジュールを作ってみようかな。
TupleDataset出来た